package domain

import (
	"io/fs"
	"os"
	"strings"
)

// AttachInfo 附件对象
type AttachInfo struct {
	FileId           string        `json:"fileId"`           // 文件id
	FileName         string        `json:"fileName"`         // 文件名
	IsDirectory      bool          `json:"isDirectory"`      // 是否是一个目录
	FileSize         int64         `json:"fileSize"`         // 文件长度
	PreviewUrl       string        `json:"previewUrl"`       // 访问地址
	PathName         string        `json:"pathName"`         // 文件路径
	ParentPathName   string        `json:"parentPathName"`   // 父级文件路径
	AbsolutePathName string        `json:"absolutePathName"` // 文件绝对路径
	FileType         string        `json:"fileType"`         // 文件类型 doc, xls,apk,wgt等
	LastUpdateTime   TimeStr       `json:"lastUpdateTime"`   // 最后修改日期  yyyy-MM-dd HH:mm:ss
	Children         []*AttachInfo `json:"children"`         // 子集数据
}

func ConvertAttr(root string, files []os.DirEntry) []*AttachInfo {
	var infos []*AttachInfo

	for _, file := range files {
		info := convert(root, file)
		infos = append(infos, &info)
	}

	return infos
}

func ConvertAttrByFile(root string, path string) AttachInfo {
	info, _ := os.Lstat(root)
	return convert(root, &statDirEntry{info})
}

func convert(root string, file os.DirEntry) AttachInfo {
	info := AttachInfo{}
	info.IsDirectory = file.IsDir()
	if file.IsDir() {
		info.FileName = file.Name()
	} else {
		split := strings.Split(file.Name(), ".")
		info.FileName = split[0]
		info.FileType = split[1]
	}
	fileInfo, _ := file.Info()
	info.PreviewUrl = root + "/" + fileInfo.Name()
	info.PathName = root + "/" + fileInfo.Name()
	info.ParentPathName = root
	info.AbsolutePathName = root + "/" + fileInfo.Name()
	info.FileSize = fileInfo.Size()
	info.LastUpdateTime = TimeStr(fileInfo.ModTime())
	return info
}

type statDirEntry struct {
	info fs.FileInfo
}

func (d *statDirEntry) Name() string               { return d.info.Name() }
func (d *statDirEntry) IsDir() bool                { return d.info.IsDir() }
func (d *statDirEntry) Type() fs.FileMode          { return d.info.Mode().Type() }
func (d *statDirEntry) Info() (fs.FileInfo, error) { return d.info, nil }
